package com.sunfeng.jksj.p27;

import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.function.Function;

/**
 * @Author : 孙峰
 * @Description: 那就是：Semaphore 可以允许多个线程访问一个临界区。
 *                      这是一把双刃剑，当多个线程进入临界区是，如果需要访问共享变脸就会存在并发问题，所以必须加锁，也就是说Semaphore 需要锁中锁。
 *
 * @Date : 2022/3/7  13:51
 */
public class Demo03 {
    public static void main(String[] args) {

    }
}

class ObjPool<T, R> {
    final List<T> pool;
    final Semaphore semaphore;

    public ObjPool(List<T> pool, Semaphore semaphore) {
        this.pool = pool;
        this.semaphore = semaphore;
    }

    R exec(Function<T, R> func) {
        T t = null;
        try {
            semaphore.acquire();
            t = pool.remove(0);
            return func.apply(t);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            pool.add(t);
            semaphore.release();
        }
        return null;
    }
}